package com.chy.jdk.classloader;

/**
 * 功能：类加载器 模板模式
 * 在ClassLoader中定义的算法顺序是：
 *     1，首先看是否有已经加载好的类。
 *     2，如果父类加载器不为空，则首先从父类类加载器加载。
 *     3，如果父类加载器为空，则尝试从启动加载器加载。
 *     4，如果两者都失败，才尝试从findClass方法加载。
 *     这是JDK类加载器的双亲委派模型，即先从父类加载器加载，直到继承体系的顶层，否则才会采用当前的类加载器加载。
 * <p>
 * ──────────────────────────────────────────
 * version  变更日期       修改人    修改说明
 * ------------------------------------------
 * V1.0.0   2022/4/2     CHY     初版
 * ──────────────────────────────────────────
 */
public class ClassLoaderTest {

    public static void main(String[] args) throws Exception {
        //测试例子1 true
        /*Class<?> clazz = ClassLoader.getSystemClassLoader().loadClass("com.chy.jdk.classloader.ClassLoaderTest");
        Object entity = clazz.newInstance();
        System.out.println(entity instanceof ClassLoaderTest);*/

        //测试例子2  false
        //为什么结果会是false呢？这是因为如果没有按照ClassLoader中提供的骨架算法去加载类的话，可能会造成JVM中有两个一模一样的类信息，他们是来自一个类文件，但却不是一个加载器加载的，所以这两个类不相等。
        //这也是类加载器为何要使用模板模式给我们定义好查找的算法，是为了保证我们加载的每一个类在虚拟机当中都有且仅有一个。
        ClassLoader classLoader = new MyClassLoader();
        Class<?> clazz = classLoader.loadClass("com.chy.jdk.classloader.ClassLoaderTest");
        Object entity = clazz.newInstance();
        System.out.println(entity instanceof ClassLoaderTest);
    }
}
